import { SettingDrawer } from '@ant-design/pro-components';
import {
  history,
  type RequestConfig,
  type RunTimeLayoutConfig,
} from '@umijs/max';
import { message, notification } from 'antd';
import './app.less';
import Footer from './components/Footer';
import {
  AvatarDropdown,
  AvatarName,
} from './components/RightContent/AvatarDropdown';
import { getUserInfo } from './services/login';
import { getToken, removeToken } from './utils/auth';
import { BASE_URL } from './utils/common';
const isDev = process.env.NODE_ENV === 'development';
const loginPath = '/login';

/**
 * @see  https://umijs.org/zh-CN/plugins/plugin-initial-state
 * */
export async function getInitialState(): Promise<{
  currentUser?: any;
  loading?: boolean;
  fetchUserInfo?: () => Promise<any | undefined>;
}> {
  let currentUser = undefined;
  const fetchUserInfo = async () => {
    try {
      const userInfo = await getUserInfo();
      return userInfo;
    } catch (error) {
      history.push(loginPath);
    }
    return undefined;
  };
  // 如果不是登录页面，执行
  const { location } = history;
  if (location.pathname !== loginPath) {
    currentUser = await fetchUserInfo();
    return {
      fetchUserInfo,
      currentUser,
      loading: false,
    };
  }
  return {
    fetchUserInfo,
    loading: false,
    currentUser,
  };
}

// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RunTimeLayoutConfig = ({
  initialState,
  setInitialState,
}) => {
  return {
    avatarProps: {
      src: initialState?.currentUser?.avatar,
      title: <AvatarName />,
      size: 'large',
      render: (_, avatarChildren) => {
        return <AvatarDropdown>{avatarChildren}</AvatarDropdown>;
      },
    },
    logo: false,
    waterMarkProps: {
      content: initialState?.currentUser?.name,
    },
    layout: 'mix',
    footerRender: () => <Footer />,
    onPageChange: () => {
      // const { location } = history;
      // // 如果没有登录，重定向到 login
      // if (!initialState?.currentUser && location.pathname !== loginPath) {
      //   history.push(loginPath);
      // }
    },
    contentStyle: {
      padding: 0,
      height: '100%',
    },
    className: 'root-main',
    bgLayoutImgList: [
      {
        src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr',
        left: 85,
        bottom: 100,
        height: '303px',
      },
      {
        src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr',
        bottom: -68,
        right: -45,
        height: '303px',
      },
      {
        src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr',
        bottom: 0,
        left: 0,
        width: '331px',
      },
    ],
    menuHeaderRender: undefined,
    // 增加一个 loading 的状态
    childrenRender: (children) => {
      return (
        <>
          {children}
          {isDev && (
            <SettingDrawer
              disableUrlParams
              enableDarkTheme
              onSettingChange={(settings) => {
                setInitialState((preInitialState) => ({
                  ...preInitialState,
                  settings,
                }));
              }}
            />
          )}
        </>
      );
    },
  };
};

/**
 * @name request 配置，可以配置错误处理
 * 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
 * @doc https://umijs.org/docs/max/request#配置
 */
//请求配置
export const request: RequestConfig = {
  timeout: 1200000,
  baseURL: process.env.NODE_ENV === 'development' ? '/api' : BASE_URL,
  // other axios options you want
  errorConfig: {
    errorHandler(error: any) {
      const { response } = error;
      if (response && response.status === 500) {
        message.error('请求错误：服务器故障，请稍后再试');
      }
    },
    errorThrower() {},
  },
  // 请求拦截
  requestInterceptors: [
    (config: any) => {
      if (getToken()) {
        config.headers['token'] = getToken();
      }
      config.headers['Content-Type'] = 'application/json';
      return config;
    },
    (error: any) => {
      return error;
    },
  ],
  // 响应拦截
  responseInterceptors: [
    (response: any) => {
      const code = response.resultCode;
      if (code < 200 || code > 300) {
        notification.error({
          message: response.message,
        });
        return Promise.reject('error');
      } else if (response.data.resultCode !== '0') {
        notification.error({
          message: response.data.message || '请求错误',
        });
        if (response.data.code === 401) {
          history.push('/login');
          removeToken();
        }
        return response.data;
      } else {
        //给前端多添加一个字段用于判断
        response.data.success = true;
        return response.data;
      }
    },
  ],
};
